'''
Created on 11 déc. 2014

@author: Damien Torond et Geoffrey Sentost
Module Place
'''

from random import randint
from modele import Placement

'''
import de randint et Placement depuis le modele.
'''

class Place():
    
    '''
    La classe Place modelise une place physique dans le parking.
    '''

    def __init__(self, niveau, pNum, pLong = None, pLarg = None, pLibre = None):
        '''
        Constructeur de la classe Place.
        Attributs:
            - longueur de type string, longueur de la place.
            - largeur de type string, largeur de la place.
            - numero de type int, numero de la place.
            - estLibre de type booleen, pour savoir si la place est libre ou pas.
            les attributs seront choisit aleatoirement, estLibre a True et numero modelise
            avec str().
        '''   
        self.niveau = niveau
        if pLong and pLarg :
            self.longueur = pLong
            self.largeur = pLarg
            self.numero = pNum
            self.estLibre = pLibre
        else :
            self.longueur = randint(100,500)
            self.largeur = randint(20,50)
            self.numero = str(niveau.getNumNiveau()) + "-" + str(pNum) + "-" + str(self.longueur) + "-" + str(self.largeur)
            self.estLibre = True # si la place est reservee a un super abo, elle ne sera pas libre
 
    
    def getNumPlace(self):
        '''
        Methode : accesseur de l'attribut numero qui retourne celui-ci.
        '''
        return self.numero
    
    
    def getLongueur(self):
        '''
         Methode : accesseur de l'attribut longueur qui retourne celui-ci.
        '''
        return self.longueur
    
    def getLargeur(self):
        '''
         Methode : accesseur de l'attribut largeur qui retourne celui-ci.
        '''
        return self.largeur
    
    
    def getNumNiveau(self):
        '''
         Methode : accesseur du numero du niveau.
        '''
        return self.niveau.getNumNiveau()
        
    def allouerPlace(self, voiture, bdd):
        '''
        Methode : demande une instance de CtrlBdd et de la classe Voiture.
        Permet d'allouer un place a une voiture et un client.
        On verifie si le client est superAbonne car il a une place permanente
        la place n'est ainsi plus libre.
        On met aussi a jour la base de donnees avec le nouveau placement.
        '''
        client = voiture.getProprietaire()
        if not client.getEstSuperAbonne() or client.getDevenirSuperAbo():
            self.estLibre = False
            bdd.allouerPlace(self)
            self.niveau.decrementer()
            
        if not voiture.getEstGaree() :
            voiture.setPlacement(bdd, Placement.Placement(self))
    
    
    def libererPlace(self, voiture, bdd):
        '''
        Methode : demande une instance de CtrlBdd et de la classe Voiture.
        Permet de liberer un place a une voiture et un client.
        On verifie si le client est superAbonne car la place doit rester intact pour celui ci
        la place est a nouveau libre.
        On met aussi a jour la base de donnees avec le nouveau placement .
        '''
        client = voiture.getProprietaire()
        voiture.getPlacement().partirPlace()
        
        if not client.getEstSuperAbonne() : 
            bdd.libererPlace(self, voiture)
            self.estLibre = True
            self.niveau.incrementer()
            
        bdd.libererPlacement(voiture)
        
    
    def getPeutEtreGaree(self, imageVoiture):
        '''
        Methode : demande une imageVoiture en parametre.
        Retourne l'image afin de savoir si la voiture, avec ses dimensions, peut etre
        mis dans le placement. On verifie si celle ci est libre.
        '''
        return (self.estLibre and self.longueur >= imageVoiture.getLongueur() and self.largeur >= imageVoiture.getLargeur())
    
        
    
        